#pragma once
#include <iostream>
#include <string>
#include <atomic>
#include <fstream>
#include <sstream>
#include <random>
#include <iomanip>
#include "logger.hpp"

namespace im
{
    // 生成一个16位随机字符的字符串
    std::string uuid()
    {
        // 生成12位的16进制数
        std::random_device rd; // 设备随机数
        std::mt19937 generator(rd()); // 梅森旋转随机数
        std::uniform_int_distribution<int> distribution(0,255); // 限定在0-255，即1字节

        std::stringstream ss;
        for (int i = 0; i < 6; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        }
        // 生成4位的16进制数
        static std::atomic<short> idx(0);
        short tmp = idx.fetch_add(1);
        ss << std::setw(4) << std::setfill('0') << std::hex << tmp;
        // 返回
        return ss.str();
    }

    bool readFile(const std::string& filename, std::string& body)
    {
        std::ifstream in(filename, std::ios::binary | std::ios::in);
        if (in.is_open() == false) {
            LOG_ERROR("{}文件打开失败", filename);
            return false;
        }

        in.seekg(0, std::ios::end);
        size_t file_sz = in.tellg();
        in.seekg(0, std::ios::beg);

        body.resize(file_sz);
        in.read(&body[0], file_sz);
        
        if (in.good() == false) {
            LOG_ERROR("读取{}文件数据失败", filename);
            in.close();
            return false;
        }

        in.close();
        return true;
    }
    bool writeFile(const std::string& filename, const std::string& body)
    {
        std::ofstream out(filename, std::ios::binary | std::ios::out | std::ios::trunc);
        if (out.is_open() == false) {
            LOG_ERROR("{}文件打开失败", filename);
            return false;
        }
        out.write(body.c_str(), body.size());
        if (out.good() == false) {
            LOG_ERROR("写入{}文件数据失败", filename);
            out.close();
            return false;
        }
        out.close();
        return true;
    }
}